package com.woniuxy.controller;

import com.woniuxy.entity.AllArticle;
import com.woniuxy.entity.DTO.ArticleQueryDTO;
import com.woniuxy.service.IArticleService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author pml
 * @Date 2025/7/16 10:20
 * @Description 帖子管理控制器
 * 处理帖子相关的所有HTTP请求，遵循RESTful API设计规范
 */
@RestController
@RequestMapping("/article")
public class ArticleController {

    @Autowired
    private IArticleService articleService;

    /**
     * 分页多条件查询帖子列表
     * 使用GET请求，参数通过查询字符串传递，符合RESTful规范
     * 支持多种查询条件组合，满足后台管理系统复杂查询需求
     */
    @GetMapping("/list")
    public ResponseData<PageResult<AllArticle>> getArticleList(ArticleQueryDTO queryDTO) {
        PageResult<AllArticle> pageResult = articleService.getArticleList(queryDTO);
        return ResponseData.ok(pageResult);
    }

    /**
     * 根据ID查询单个帖子
     * 路径参数方式传递帖子ID，清晰直观
     */
    @GetMapping("/{articleId}")
    public ResponseData<AllArticle> getArticleById(@PathVariable Long articleId) {
        AllArticle article = articleService.getById(articleId);
        return ResponseData.ok(article);
    }

    /**
     * 新增帖子
     * 使用POST请求，JSON格式传递帖子信息
     * 实际项目中应添加权限校验，确保只有登录用户可发布
     */
    @PostMapping
    public ResponseData addArticle(@RequestBody AllArticle article) {
        boolean success = articleService.save(article);
        return success ? ResponseData.ok() : ResponseData.fail(500, "新增帖子失败");
    }

    /**
     * 更新帖子信息
     * 使用PUT请求，JSON格式传递更新信息
     * 全量更新，需传递完整的帖子对象
     */
    @PutMapping
    public ResponseData updateArticle(@RequestBody AllArticle article) {
        boolean success = articleService.updateById(article);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新帖子失败");
    }

    /**
     * 更新帖子状态（审核功能）
     * 单独的接口用于状态更新，便于前端实现审核按钮功能
     * 使用PATCH请求表示部分更新，符合RESTful规范
     */
    @PatchMapping("/status")
    public ResponseData updateArticleStatus(Long id, Integer status) {
        boolean success = articleService.updateArticleStatus(id, status);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新帖子状态失败");
    }

    /**
     * 根据ID删除单个帖子
     * 使用DELETE请求，路径参数传递帖子ID
     * 实际项目中建议使用逻辑删除而非物理删除
     */
    @DeleteMapping("/{articleId}")
    public ResponseData deleteArticle(@PathVariable("articleId") Long articleId) {
        boolean success = articleService.removeById(articleId);
        return success ? ResponseData.ok() : ResponseData.fail(500, "删除帖子失败");
    }

    /**
     * 批量删除帖子
     * 使用DELETE请求，请求体传递帖子ID列表
     * 支持一次删除多个帖子，提高操作效率
     */
    @DeleteMapping("/batch")
    public ResponseData batchDeleteArticle(@RequestBody List<Long> articleIds) {
        boolean success = articleService.removeByIds(articleIds);
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量删除失败");
    }

    // 新增统计接口
    @GetMapping("/stats/total")
    public ResponseData getArticleStats() {
        Map<String/* statistic */, Object/* value */> stats = new HashMap<>();
        stats.put("publishedCount", articleService.countPublishedArticles());
        stats.put("totalViewCount", articleService.sumTotalViewCount());
        return ResponseData.ok(stats);
    }

    @GetMapping("/stats/trend")
    public ResponseData getPublishTrend() {
        return ResponseData.ok(articleService.getPublishTrendByDate());
    }
}
